package stack_opt

import (
	"Yasuo/iface/istack_opt"
	"errors"
	"fmt"
	"github.com/xuri/efp"
)

type contextStackOpt struct {
	Strategy istack_opt.IStackOpt
}

func NewContextStackOpt(s istack_opt.IStackOpt) *contextStackOpt {
	return &contextStackOpt{Strategy:s}
}

// 策略工厂
func FactoryStackOpt(token efp.Token) (istack_opt.IStackOpt,error) {
	fmt.Println("当前token", token)
	// 对应形式 stest(
	// 1. start函数策略
	// 函数太多，以后解耦
	if token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStart {
		switch token.TValue {
		case "":
			return NewStarCommon(), nil
		case "OpStatus":
			return NewOpStatus(), nil
		case "if": // if 函数
			return NewIfOpt(), nil
		}
	}

	// 2. 基本操作符入栈策略
	if token.TType ==efp.TokenTypeOperatorInfix && token.TSubType == efp.TokenSubTypeMath {
		return NewLogicIinsertOPT(token.TValue),nil
	}

	// 3. 基本操作数入栈
	if token.TType == efp.TokenTypeOperand && token.TSubType == efp.TokenSubTypeNumber {
		return NewOpdNum(token.TValue),nil
	}

	//4. 结束自行运算
	if token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStop {
		return NewStopCommon(), nil
	}

	// 5. 逻辑运算操作 > < =入栈
	if token.TType == efp.TokenTypeOperatorInfix && token.TSubType == efp.TokenSubTypeLogical {
		return FactoryLogic(token.TValue), nil
	}

	// 6. 临时变量栈
	if token.TType== efp.TokenTypeOperand && token.TSubType == efp.TokenSubTypeRange {
		return NewVarOPT(token.TValue), nil
	}

	// 7. 碰到空格
	if token.TType == efp.TokenTypeOperatorInfix && token.TSubType == efp.TokenSubTypeIntersection {
		return NewNullOPT(), nil
	}

	// 8. 碰到 (
	if token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStart {
		return FactorySatrt(token.TValue), nil
	}

	// 9. 碰到 )
	if token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStop {
		return FactoryStop(token.TValue), nil
	}

	return nil,errors.New("context没有这个策略")
}